package main


import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

// handlerFunc
func indexHandler(c *gin.Context) {
	fmt.Println("index")
	name, ok := c.Get("name")	// 从上下文中取值
	if !ok {
		name = "匿名用户"
	}
	c.JSON(http.StatusOK, gin.H{
		"msg": name,
	})
}

// 定义一个中间件m1: 统计请求处理函数的耗时
func m1(c *gin.Context) {
	fmt.Println("m1 in ...")
	// 计时
	start := time.Now()
	c.Next()	// 调用后续的处理函数
	//c.Abort()	// 阻止调用后续的处理函数
	cost := time.Since(start)
	fmt.Printf("cost: %v\n", cost)
	fmt.Println("m1 out ...")
}

func m2(c *gin.Context) {
	fmt.Println("m2 in ...")
	c.Set("name", "tansi")	// 在上下文c中设置值
	c.Next() 	// 调用后续的处理函数
	//return
	fmt.Println("m2 out ...")
}



func authMiddleware(doCheck bool)gin.HandlerFunc {
	// 连接数据库
	// 或做一些其他准备工作
	return func(c *gin.Context) {
		if doCheck {
			// 是否登录的判断
			// if 是登录的用户
			c.Next()
			// else
			// c.Abort()
		} else {
			c.Next()
		}

	}
}

func main() {
	r := gin.Default()	// 默认使用了Logger()和Recovery()中间件

	r.Use(m1, m2, authMiddleware(true))	// 全局注册中间件函数
	//r.GET("/index", func(c *gin.Context) {
	//	c.JSON(http.StatusOK, gin.H{
	//		"msg": "index",
	//	})
	//})

	r.GET("/index", m1, indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})

	r.GET("/user", m1 , func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})

	// 路由组注册中间件方法1
	xxGroup := r.Group("/xx", authMiddleware(true))
	{
		xxGroup.GET("/index", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "xxGroup"})
		})
	}

	// 路由组注册中间价方法2


	r.Run(":9000")
}
